{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Using distorter\n",
    " \n",
    " The concept of cation mutation (ion substitution) to tune the properties of compounds has been around at least [since the 1950s](https://www.sciencedirect.com/science/article/pii/0022369758900507) and has proved a useful concept in [more recent studies](https://journals.aps.org/prb/abstract/10.1103/PhysRevB.79.165211).\n",
    "\n",
    "![](cation_mutation.png)\n",
    "\n",
    "This example generates all possible (symmetry inequivalent) substitutions of Sr on Ba sites in the cubic perovskite\n",
    "BaTiO3; single and double substitutions.\n",
    "The distorter module uses the [ASE Python library](https://wiki.fysik.dtu.dk/ase/) to achieve this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import smact.builder as builder\n",
    "import smact.distorter as distort"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------------------------\n",
      "Original coordinates: \n",
      "0.000 0.000 0.000 Ba\t0.000 6.000 6.000 Ba\t6.000 6.000 0.000 Ba\t\n",
      "3.000 3.000 3.000 Ti\t3.000 9.000 9.000 Ti\t9.000 9.000 3.000 Ti\t\n",
      "3.000 3.000 0.000 O\t3.000 9.000 6.000 O\t9.000 9.000 0.000 O\t\n",
      "0.000 3.000 3.000 O\t0.000 9.000 9.000 O\t6.000 9.000 3.000 O\t\n",
      "3.000 0.000 3.000 O\t3.000 6.000 9.000 O\t9.000 6.000 3.000 O\t\n",
      "0.000 0.000 6.000 Ba\t6.000 0.000 0.000 Ba\t6.000 6.000 6.000 Ba\t\n",
      "3.000 3.000 9.000 Ti\t9.000 3.000 3.000 Ti\t9.000 9.000 9.000 Ti\t\n",
      "3.000 3.000 6.000 O\t9.000 3.000 0.000 O\t9.000 9.000 6.000 O\t\n",
      "0.000 3.000 9.000 O\t6.000 3.000 3.000 O\t6.000 9.000 9.000 O\t\n",
      "3.000 0.000 9.000 O\t9.000 0.000 3.000 O\t9.000 6.000 9.000 O\t\n",
      "0.000 6.000 0.000 Ba\t6.000 0.000 6.000 Ba\t\n",
      "3.000 9.000 3.000 Ti\t9.000 3.000 9.000 Ti\t\n",
      "3.000 9.000 0.000 O\t9.000 3.000 6.000 O\t\n",
      "0.000 9.000 3.000 O\t6.000 3.000 9.000 O\t\n",
      "3.000 6.000 3.000 O\t9.000 0.000 9.000 O\t\n",
      "--------------------------------------------------------------------\n",
      "Single: \n",
      "0.000 0.000 0.000 Sr\t0.000 6.000 6.000 Ba\t6.000 6.000 0.000 Ba\t\n",
      "3.000 3.000 3.000 Ti\t3.000 9.000 9.000 Ti\t9.000 9.000 3.000 Ti\t\n",
      "3.000 3.000 0.000 O\t3.000 9.000 6.000 O\t9.000 9.000 0.000 O\t\n",
      "0.000 3.000 3.000 O\t0.000 9.000 9.000 O\t6.000 9.000 3.000 O\t\n",
      "3.000 0.000 3.000 O\t3.000 6.000 9.000 O\t9.000 6.000 3.000 O\t\n",
      "0.000 0.000 6.000 Ba\t6.000 0.000 0.000 Ba\t6.000 6.000 6.000 Ba\t\n",
      "3.000 3.000 9.000 Ti\t9.000 3.000 3.000 Ti\t9.000 9.000 9.000 Ti\t\n",
      "3.000 3.000 6.000 O\t9.000 3.000 0.000 O\t9.000 9.000 6.000 O\t\n",
      "0.000 3.000 9.000 O\t6.000 3.000 3.000 O\t6.000 9.000 9.000 O\t\n",
      "3.000 0.000 9.000 O\t9.000 0.000 3.000 O\t9.000 6.000 9.000 O\t\n",
      "0.000 6.000 0.000 Ba\t6.000 0.000 6.000 Ba\t\n",
      "3.000 9.000 3.000 Ti\t9.000 3.000 9.000 Ti\t\n",
      "3.000 9.000 0.000 O\t9.000 3.000 6.000 O\t\n",
      "0.000 9.000 3.000 O\t6.000 3.000 9.000 O\t\n",
      "3.000 6.000 3.000 O\t9.000 0.000 9.000 O\t\n",
      "--------------------------------------------------------------------\n",
      "Substituted coordinates 0\n",
      "0.000 0.000 0.000 Sr\t0.000 6.000 6.000 Ba\t6.000 6.000 0.000 Ba\t\n",
      "3.000 3.000 3.000 Ti\t3.000 9.000 9.000 Ti\t9.000 9.000 3.000 Ti\t\n",
      "3.000 3.000 0.000 O\t3.000 9.000 6.000 O\t9.000 9.000 0.000 O\t\n",
      "0.000 3.000 3.000 O\t0.000 9.000 9.000 O\t6.000 9.000 3.000 O\t\n",
      "3.000 0.000 3.000 O\t3.000 6.000 9.000 O\t9.000 6.000 3.000 O\t\n",
      "0.000 0.000 6.000 Sr\t6.000 0.000 0.000 Ba\t6.000 6.000 6.000 Ba\t\n",
      "3.000 3.000 9.000 Ti\t9.000 3.000 3.000 Ti\t9.000 9.000 9.000 Ti\t\n",
      "3.000 3.000 6.000 O\t9.000 3.000 0.000 O\t9.000 9.000 6.000 O\t\n",
      "0.000 3.000 9.000 O\t6.000 3.000 3.000 O\t6.000 9.000 9.000 O\t\n",
      "3.000 0.000 9.000 O\t9.000 0.000 3.000 O\t9.000 6.000 9.000 O\t\n",
      "0.000 6.000 0.000 Ba\t6.000 0.000 6.000 Ba\t\n",
      "3.000 9.000 3.000 Ti\t9.000 3.000 9.000 Ti\t\n",
      "3.000 9.000 0.000 O\t9.000 3.000 6.000 O\t\n",
      "0.000 9.000 3.000 O\t6.000 3.000 9.000 O\t\n",
      "3.000 6.000 3.000 O\t9.000 0.000 9.000 O\t\n",
      "--------------------------------------------------------------------\n",
      "Substituted coordinates 1\n",
      "0.000 0.000 0.000 Sr\t0.000 6.000 6.000 Sr\t6.000 6.000 0.000 Ba\t\n",
      "3.000 3.000 3.000 Ti\t3.000 9.000 9.000 Ti\t9.000 9.000 3.000 Ti\t\n",
      "3.000 3.000 0.000 O\t3.000 9.000 6.000 O\t9.000 9.000 0.000 O\t\n",
      "0.000 3.000 3.000 O\t0.000 9.000 9.000 O\t6.000 9.000 3.000 O\t\n",
      "3.000 0.000 3.000 O\t3.000 6.000 9.000 O\t9.000 6.000 3.000 O\t\n",
      "0.000 0.000 6.000 Ba\t6.000 0.000 0.000 Ba\t6.000 6.000 6.000 Ba\t\n",
      "3.000 3.000 9.000 Ti\t9.000 3.000 3.000 Ti\t9.000 9.000 9.000 Ti\t\n",
      "3.000 3.000 6.000 O\t9.000 3.000 0.000 O\t9.000 9.000 6.000 O\t\n",
      "0.000 3.000 9.000 O\t6.000 3.000 3.000 O\t6.000 9.000 9.000 O\t\n",
      "3.000 0.000 9.000 O\t9.000 0.000 3.000 O\t9.000 6.000 9.000 O\t\n",
      "0.000 6.000 0.000 Ba\t6.000 0.000 6.000 Ba\t\n",
      "3.000 9.000 3.000 Ti\t9.000 3.000 9.000 Ti\t\n",
      "3.000 9.000 0.000 O\t9.000 3.000 6.000 O\t\n",
      "0.000 9.000 3.000 O\t6.000 3.000 9.000 O\t\n",
      "3.000 6.000 3.000 O\t9.000 0.000 9.000 O\t\n",
      "--------------------------------------------------------------------\n",
      "Substituted coordinates 2\n",
      "0.000 0.000 0.000 Sr\t0.000 6.000 6.000 Ba\t6.000 6.000 0.000 Ba\t\n",
      "3.000 3.000 3.000 Ti\t3.000 9.000 9.000 Ti\t9.000 9.000 3.000 Ti\t\n",
      "3.000 3.000 0.000 O\t3.000 9.000 6.000 O\t9.000 9.000 0.000 O\t\n",
      "0.000 3.000 3.000 O\t0.000 9.000 9.000 O\t6.000 9.000 3.000 O\t\n",
      "3.000 0.000 3.000 O\t3.000 6.000 9.000 O\t9.000 6.000 3.000 O\t\n",
      "0.000 0.000 6.000 Ba\t6.000 0.000 0.000 Sr\t6.000 6.000 6.000 Ba\t\n",
      "3.000 3.000 9.000 Ti\t9.000 3.000 3.000 Ti\t9.000 9.000 9.000 Ti\t\n",
      "3.000 3.000 6.000 O\t9.000 3.000 0.000 O\t9.000 9.000 6.000 O\t\n",
      "0.000 3.000 9.000 O\t6.000 3.000 3.000 O\t6.000 9.000 9.000 O\t\n",
      "3.000 0.000 9.000 O\t9.000 0.000 3.000 O\t9.000 6.000 9.000 O\t\n",
      "0.000 6.000 0.000 Ba\t6.000 0.000 6.000 Ba\t\n",
      "3.000 9.000 3.000 Ti\t9.000 3.000 9.000 Ti\t\n",
      "3.000 9.000 0.000 O\t9.000 3.000 6.000 O\t\n",
      "0.000 9.000 3.000 O\t6.000 3.000 9.000 O\t\n",
      "3.000 6.000 3.000 O\t9.000 0.000 9.000 O\t\n",
      "--------------------------------------------------------------------\n",
      "Substituted coordinates 3\n",
      "0.000 0.000 0.000 Sr\t0.000 6.000 6.000 Ba\t6.000 6.000 0.000 Ba\t\n",
      "3.000 3.000 3.000 Ti\t3.000 9.000 9.000 Ti\t9.000 9.000 3.000 Ti\t\n",
      "3.000 3.000 0.000 O\t3.000 9.000 6.000 O\t9.000 9.000 0.000 O\t\n",
      "0.000 3.000 3.000 O\t0.000 9.000 9.000 O\t6.000 9.000 3.000 O\t\n",
      "3.000 0.000 3.000 O\t3.000 6.000 9.000 O\t9.000 6.000 3.000 O\t\n",
      "0.000 0.000 6.000 Ba\t6.000 0.000 0.000 Ba\t6.000 6.000 6.000 Ba\t\n",
      "3.000 3.000 9.000 Ti\t9.000 3.000 3.000 Ti\t9.000 9.000 9.000 Ti\t\n",
      "3.000 3.000 6.000 O\t9.000 3.000 0.000 O\t9.000 9.000 6.000 O\t\n",
      "0.000 3.000 9.000 O\t6.000 3.000 3.000 O\t6.000 9.000 9.000 O\t\n",
      "3.000 0.000 9.000 O\t9.000 0.000 3.000 O\t9.000 6.000 9.000 O\t\n",
      "0.000 6.000 0.000 Ba\t6.000 0.000 6.000 Sr\t\n",
      "3.000 9.000 3.000 Ti\t9.000 3.000 9.000 Ti\t\n",
      "3.000 9.000 0.000 O\t9.000 3.000 6.000 O\t\n",
      "0.000 9.000 3.000 O\t6.000 3.000 9.000 O\t\n",
      "3.000 6.000 3.000 O\t9.000 0.000 9.000 O\t\n",
      "--------------------------------------------------------------------\n",
      "Substituted coordinates 4\n",
      "0.000 0.000 0.000 Sr\t0.000 6.000 6.000 Ba\t6.000 6.000 0.000 Ba\t\n",
      "3.000 3.000 3.000 Ti\t3.000 9.000 9.000 Ti\t9.000 9.000 3.000 Ti\t\n",
      "3.000 3.000 0.000 O\t3.000 9.000 6.000 O\t9.000 9.000 0.000 O\t\n",
      "0.000 3.000 3.000 O\t0.000 9.000 9.000 O\t6.000 9.000 3.000 O\t\n",
      "3.000 0.000 3.000 O\t3.000 6.000 9.000 O\t9.000 6.000 3.000 O\t\n",
      "0.000 0.000 6.000 Ba\t6.000 0.000 0.000 Ba\t6.000 6.000 6.000 Sr\t\n",
      "3.000 3.000 9.000 Ti\t9.000 3.000 3.000 Ti\t9.000 9.000 9.000 Ti\t\n",
      "3.000 3.000 6.000 O\t9.000 3.000 0.000 O\t9.000 9.000 6.000 O\t\n",
      "0.000 3.000 9.000 O\t6.000 3.000 3.000 O\t6.000 9.000 9.000 O\t\n",
      "3.000 0.000 9.000 O\t9.000 0.000 3.000 O\t9.000 6.000 9.000 O\t\n",
      "0.000 6.000 0.000 Ba\t6.000 0.000 6.000 Ba\t\n",
      "3.000 9.000 3.000 Ti\t9.000 3.000 9.000 Ti\t\n",
      "3.000 9.000 0.000 O\t9.000 3.000 6.000 O\t\n",
      "0.000 9.000 3.000 O\t6.000 3.000 9.000 O\t\n",
      "3.000 6.000 3.000 O\t9.000 0.000 9.000 O\t\n",
      "====================================================================\n"
     ]
    }
   ],
   "source": [
    "def pretty_print_atoms(atoms, linewrap=15):\n",
    "    entries = [\"{0:5.3f} {1:5.3f} {2:5.3f} {symbol}\".format(*position,\n",
    "                                                            symbol=symbol)\n",
    "               for position, symbol in zip(atoms.get_positions(),\n",
    "                                           atoms.get_chemical_symbols())]\n",
    "\n",
    "    for output_i in range(linewrap):\n",
    "        line = ''\n",
    "        for i, entry in enumerate(entries):\n",
    "            if (output_i == i % linewrap):\n",
    "                line = line + entry + '\\t'\n",
    "        print(line)\n",
    "\n",
    "# Build the input\n",
    "smact_lattice, test_case = builder.cubic_perovskite(['Ba', 'Ti', 'O'],\n",
    "                                                    repetitions=[2, 2, 2])\n",
    "\n",
    "hlinewidth = 68\n",
    "\n",
    "\n",
    "print('-' * hlinewidth)\n",
    "print(\"Original coordinates: \")\n",
    "pretty_print_atoms(test_case)\n",
    "print('-' * hlinewidth)\n",
    "\n",
    "# Do the single substitution first, it is trivial as all Ba\n",
    "#  sites are equivalent we will choose the first Ba\n",
    "subs_site = [0.0, 0.0, 0.0]\n",
    "single_substitution = distort.make_substitution(test_case, subs_site, \"Sr\")\n",
    "print(\"Single: \")\n",
    "pretty_print_atoms(single_substitution)\n",
    "\n",
    "# Build a sub-lattice you wish to disorder [test case do the Ba sub-lattice]\n",
    "sub_lattice = distort.build_sub_lattice(single_substitution, \"Ba\")\n",
    "\n",
    "# Enumerate the inequivalent sites\n",
    "inequivalent_sites = distort.get_inequivalent_sites(sub_lattice,\n",
    "                                                    single_substitution)\n",
    "\n",
    "# Replace Ba at inequivalent sites with Sr\n",
    "for i, inequivalent_site in enumerate(inequivalent_sites):\n",
    "    print('-' * hlinewidth)\n",
    "    print(\"Substituted coordinates {0}\".format(i))\n",
    "    distorted = distort.make_substitution(single_substitution,\n",
    "                                          inequivalent_site,\n",
    "                                          \"Sr\")\n",
    "    pretty_print_atoms(distorted)\n",
    "\n",
    "print('='*hlinewidth)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# The distorted objects are of the ase atoms class,\n",
    "# so can be written out to a crystal structure file like a cif\n",
    "distorted.write('example_output.cif')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
